% function melhor_pos_global = pso()

clear all;

dimensoes = 30;
populacao = 20;
lower = -30;
upper = 30;
iteracoes = 1000;
j=0;
omega = 0.5;
phi_social = 0.9;
phi_cognitivo = 0.1;

particulas = rand(populacao, dimensoes);
particulas = lower + particulas * (upper - lower);
melhor_posicao = particulas;
valores = avalia2(particulas);
[melhor_valor, pos] = min(valores);
melhor_valor_global = melhor_valor;
melhor_pos_global = particulas(pos,:);
velocidades = lower + rand(populacao, dimensoes) * (upper - lower);

while j<iteracoes
    j = j + 1
    rp = rand(populacao, dimensoes);
    rg = rand(1);
    velocidades = omega * velocidades;
    velocidades = velocidades + phi_cognitivo .* rp .* (melhor_posicao - particulas); 
    for i = 1:dimensoes 
        velocidades(:,i) = velocidades(:,i) + phi_social * rg * (melhor_pos_global(i) - particulas(:,i));
    end
    cap_max = 10 * ones(populacao, dimensoes);
    cap_min = -10 * ones(populacao, dimensoes);
    velocidades = min(velocidades, cap_max);
    velocidades = max(velocidades, cap_min);
    particulas_novo = particulas + velocidades;
    valores_novo = avalia2(particulas);
    minimos = min(valores, valores_novo);
    aux = (minimos == valores_novo);
    aux2 = zeros(populacao, dimensoes);
    for i=1:dimensoes
        aux2(:,i) = aux;
    end
    particulas = (1-aux2).*particulas + aux2.*particulas_novo;
    [melhor_valor, pos] = min(valores_novo);
    if melhor_valor < melhor_valor_global 
        melhor_pos_global = particulas(pos,:);
        melhor_valor_global = melhor_valor;
    end
    particulas = particulas_novo;
    valores = valores_novo;
%     if mod(j,1) == 0
%         plot(particulas(:,1),particulas(:,2),'*')
%         axis([-30 30 -30 30]);
%         drawnow
%     end
end
melhor_pos_global
melhor_valor_global
    
    